LLama Factory与Xtuner分布式微调大模型
1. 为什么需要分布式训练?
模型规模爆炸 现代大模型(如GPT-3、LLaMA等)参数量达千亿级别,单卡GPU无法存储完整模型。
计算资源需求: 训练大模型需要海量计算(如GPT-3需数万GPU小时),分布式训练可加速训练过程。
内存瓶颈: 单卡显存不足以容纳大模型参数、梯度及优化器状态。
1.2分布式训练的核心技术
数据并行(Data Parallelism)
每张卡上拥有完整的模型参数,将用户的问题分为8个批次,单独处理。
原理: 将数据进行批次的划分,分发到不同的设备上,每个设备拥有完整的模型副本。
同步方式: 通过All-Reduce操作同步梯度(如PyTorch的DistributedDataParallel(DDP))
挑战: 通信开销大,显存占用高(需存储完整模型参数和优化器状态)
模型并行(Model Parallelism)
原理: 将模型按层,或者结构块分为多份,每张卡上存放完整模型的一部分。
类型: 横向并行(层拆分): 将模型的层分配到不同设备。
纵向并行(张量拆分): 如Megatron-LM将矩阵乘法分片。
挑战: 设备间通信频繁,负载均衡需精细设计。
流水线并行(Pipeline Parallelism)
原理: 将模型按层划分为多个阶段(stage), 数据分块后按流水线执行。
优化: 微批次(Micro-batching)减少流水线气泡(Bubble)。
挑战: 需平衡阶段划分,避免资源闲置。
混合并行(3D并行)
组合策略: 结合数据并行、模型并行、流水线并行,典型应用如训练千亿级模型。
案例: 微软Turing-NLG、Meta的LLaMA-2。
关于大模型微调的批次问题: 批次是个超参数(得根据具体场景来实验的数据。)
批次跟模型大小、显存大小、训练数据大小(最大编码长度)都有关系。具体给多大,得测试。一般保证训练 时显存的占用率为90%左右。
模型占显存的大小是可以算的: 例如qwen1.5B模型大小为: 1.5 * 10亿 * 16bit = ??? bit 转换为GB就是模型所需的最小存储空间。
DeepSpeed框架
定位: 微软开源的分布式训练优化框架,支持千亿参数模型训练。
核心目标: 降低大模型训练成本,提升显存和计算效率。
集成生态: 与PyTorch无缝兼容,支持Hugging Face Transformers库。
2.2 核心技术
ZeRO(Zero Redundancy Optimizer)
原理: 通过分片优化器状态、梯度、参数,消除数据并行中的显存冗余。
阶段划分:
ZeRO-1: 优化器状态分片。
ZeRO-2: 梯度分片 + 优化器状态分片。
单卡算力较低,但显存足够,可以使用ZeRO-2联合多卡,提升计算速度。
ZeRO-3: 参数分片 + 梯度分片 + 优化器状态分片。
单卡无法训练模型,采用ZeRO-3联合多卡,优化显存。保障模型可以正常训练。
优势: 显存占用随设备数线性下降,支持训练更大模型。
一般情况,对于微调而言,首先考虑ZeRO-2。对于大家来讲,常见的问题是算力不足问题,而不是显存不足问题。
